from bs4 import BeautifulSoup


def get_soup(path):
    with open(path, 'rt', encoding='utf-8') as html:
        # bs4 会将 换行符也解析成tag，获取子节点时会有问题
        html = html.read().replace('\r\n', '').replace('\n', '').replace('\t', '')
        # print(html)
        return BeautifulSoup(html, 'lxml')


if __name__ == '__main__':
    # css-selector 和 bf4 练习
    soup = get_soup('Jd_search_洗衣液.html')
    # 获取所有商品的elements
    # 模糊匹配："^" 匹配开头，"$" 匹配结尾，"*" 匹配子集
    # li[class^=gl-item] 匹配 class 为 "gl-item" 开头的 li
    gl_item = soup.select('#J_goodsList > ul > li[class^=gl-item]')
    print(len(gl_item))  # 30条数据
    # 获取第一个 item
    first_item = gl_item[0]
    # 获取子节点
    # first_item.contents: 直接返回列表形式
    # first_item.children: 迭代器形式
    print(type(first_item.contents))  # <class 'list'>
    print(type(first_item.children))  # <class 'list_iterator'>
    # 获取父节点
    print(first_item.parent)
    # 获取上一个和下一个节点
    print(first_item.previous_sibling)
    print(first_item.next_sibling)
    # 获取当前节点所有文本，可以用get_text()方法指定分隔符和是否需要strip
    print(first_item.text)
    print(first_item.get_text(separator='\n', strip=True))
    # 获取属性，操作同dict，使用get方法不会抛异常，没获取到值返回None，直接用[]，获取不到则抛异常
    print(first_item.attrs)  # 获取所有属性的 dict
    print(first_item['data-sku'])
    print(first_item.get('data-sku'))
    print(first_item.attrs['data-sku'])
    print(first_item.attrs.get('data-sku'))
